-- SPDX-License-Identifier: GPL-3.0-or-later

local CardItem = require "packages.hearthstone.battlegrounds.core.card.carditem"


--- 炉石传说法术类
--- 
--- 法术是单次使用的效果卡牌
--- 继承自CardItem，定义法术效果框架
---
---@class Hearthstone.Spell : Hearthstone.CardItem
---@field public spell_school string @ 法术学派（奥术/火焰/冰霜/自然/神圣/暗影/无）
---@field public target_type string @ 目标类型："character"角色 | "minion"随从 | "none"无目标
---@field public effect function @ 效果函数
---@field public tavern_level integer? @ 酒馆等级，仅酒馆战旗模式使用
local Spell = CardItem:subclass("Hearthstone.Spell")

---@alias SpellSchool string
Spell.Arcane = "arcane"         -- 奥术
Spell.Fire = "fire"             -- 火焰
Spell.Frost = "frost"           -- 冰霜
Spell.Nature = "nature"         -- 自然
Spell.Holy = "holy"             -- 神圣
Spell.Shadow = "shadow"         -- 暗影
Spell.None = "none"             -- 无学派

---@alias TargetType string
Spell.TargetCharacter = "character"  -- 角色（英雄或随从）
Spell.TargetMinion = "minion"        -- 随从
Spell.TargetNone = "none"            -- 无目标

--- 构造函数
---@param name string @ 法术名称
---@param cost integer @ 法力值消耗
---@param spell_school string @ 法术学派
---@param target_type string @ 目标类型
---@param rarity string @ 稀有度
---@param card_class string @ 职业
---@param card_set string @ 卡牌集
---@param tavern_level integer? @ 酒馆等级（酒馆战旗模式）
function Spell:initialize(name, cost, spell_school, target_type, rarity, card_class, card_set, tavern_level)
  CardItem.initialize(self, name, cost, CardItem.TypeSpell, rarity, card_class, card_set)
  
  self.spell_school = spell_school or Spell.None
  self.target_type = target_type or Spell.TargetNone
  self.effect = nil -- 由具体法术设置
  
  -- 酒馆战旗专用字段
  self.tavern_level = tavern_level
end

function Spell:__tostring()
  return "<Spell " .. self.name .. " (" .. self.cost .. ")>"
end

--- 克隆法术
---@param new_name string? @ 新名称
---@return Spell
function Spell:clone(new_name)
  local cloned = self.class:new(
    new_name or self.name,
    self.cost,
    self.spell_school,
    self.target_type,
    self.rarity,
    self.card_class,
    self.card_set,
    self.tavern_level
  )
  
  -- 复制技能
  cloned.skills = {}
  for _, skill in ipairs(self.skills) do
    table.insert(cloned.skills, skill)
  end
  
  -- 复制效果函数
  cloned.effect = self.effect
  
  return cloned
end

--- 检查是否为指定学派
---@param school string @ 法术学派
---@return boolean
function Spell:isSchool(school)
  return self.spell_school == school
end

--- 检查目标类型
---@param target_type string @ 目标类型
---@return boolean
function Spell:isTargetType(target_type)
  return self.target_type == target_type
end

--- 设置效果函数
---@param effect_func function @ 效果函数
function Spell:setEffect(effect_func)
  self.effect = effect_func
end

--- 执行法术效果
---@param caster Player @ 施法者
---@param targets Player[] @ 目标列表
---@param data table? @ 额外数据
---@return boolean @ 是否成功执行
function Spell:cast(caster, targets, data)
  if not self.effect then
    return false
  end
  
  -- 验证目标数量
  if self.target_type == Spell.TargetNone then
    if targets and #targets > 0 then
      return false -- 无目标法术不应有目标
    end
  elseif self.target_type == Spell.TargetMinion then
    -- 验证目标都是随从
    for _, target in ipairs(targets or {}) do
      if not target:isInstanceOf(Minion) then
        return false
      end
    end
  end
  
  -- 执行效果
  return self.effect(caster, targets, data)
end

--- 获取法术描述（包含学派信息）
---@param lang string? @ 语言
---@return string
function Spell:getDescription(lang)
  local desc = CardItem.getDescription(self, lang)
  if self.spell_school ~= Spell.None then
    desc = desc .. " (" .. self.spell_school .. ")"
  end
  return desc
end

return Spell
